1

继承

原型链

  • 原型链是说明

构造函数或构造器具有prototype属性,对象具有proto属性,这就是之前学习的原。如果构造函数或对象A 。A的原型指向构造函数或对象B,B的原型在指向构造函数或对象C,依次类推,最终的构造函数或对象原型指向Object的原型。由此形成一条链状结构,被称之为原型链。按照上述描述,在B中定义的属性或发放,可以直接在A中使用不需要定义。 这就是继承,它允许每一个对象访问器原型链上的任何属性和方法。
原型链实现继承
function A(){
this.name ='a';
this.toString = function(){return this.name};
}
function B (){
this.name = 'b';
}
function C(){
this.name ='c';
this.age=18;
this.getAge =function(){return this.age};
}
B.prototype =new A();
C.prototype =new B();

  • 只继承于原型

出于对效率的考虑,尽可能地将属性和方法添加到原型上。可以采取以下方式:
不要为继承关系单独创建对象;
尽量减少运行的方法搜索。
代码如下:
function A(){}
A.prototype.name ='a';
Aprototype.toString = function(){return this.name};
function B(){}
B.prototype=A.prototype;
B.prototype.name='b';
function C(){}
C.protype =B.protype;
C.protype.name='c';
C.protype.age=18;
C.protype.getAge =function(){return this.age};

  • 原型链的问题

原型链虽然很强大,用它可以实现JavasScript中的继承,但同时也存在一些问题。
原型链实际上是在多个构造函数或对象直接共享属性或方法。
创建子类的对象是不能向父级的构造函数传递任何参数。
综上所述,在实际开发中很少会单独使用原型链。

继承

  • 原型式继承

所谓原型是继承,就是定义一个函数,该函数中创建一个零食性的构造函数,将作为参数传入的对象作为这个构造函数的原型,最后返回这个构造函数的实例对象。
function object (o){
function F(){}
F.prototype = o ;
return new F();
}
根据原型继承的总结的object()函数实现继承,如下代码:
var preson ={
name:'MARY',
friends:['Tom','King']
}
var anotherPerson =object(person);
anotherperson.friends.push('Rob');
console.log(antherperson.friends);
这种原型继承要求必须具有一个对象可以看作最为另一个对象的基础。

  • 借助构造函数

无论是原型链还是原型是继承,都具有相同的问题。想要解决这样的问题的话可以借助构造函数(也可以叫做伪造对象的经典继承)。
这种方式实现非常简单,就是在子对象的构造函数中调用父对象的构造函数。具体可以通过调用函数。
apply()call()方法实现。
apply()和call()方法都允许传递制定某个对象的this。对于继承来讲, 可以实现在子对象的构造函数中调用父对象的构造函数,将子对象的this和父对象的this绑定子啊一起。
代码如下:
function SuperType(){
this.color=['red','green','blue'];
}
function SubType(){
SuperType.call(this);
}
var instance=new Subtype();
instance.color;
组合方式继承
组合继承,也叫做为经典继承,指的是将原型链或原型继承和借助构造函数的技术组合在一起,发挥二中的长处继承方式。
集体实现的思路就是:
使用原型链或原型是继承实现对原型的继承属性和方法的继承。
通过借助构造函数实现的实例对象的属性继承。
这样,即通过在原型上定义方法实现函数的重用,又可以保证每一个对象都又自己的专有属性。
代码如下:function SuperType(name){
this name = name;
}
superType.prototype.sayme=function(){
console.log(this.name)}


李通
15 声望5 粉丝